﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.Печать

// Переопределяет настройки печати для объекта.
//
// Параметры:
//  Настройки - см. УправлениеПечатью.НастройкиПечатиОбъекта.
//
Процедура ПриОпределенииНастроекПечати(Настройки) Экспорт
	
	Настройки.ПриДобавленииКомандПечати = Истина;
	
КонецПроцедуры

// Заполняет список команд печати.
// 
// Параметры:
//  КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "СогласиеНаОбработкуПерсональныхДанных";
	КомандаПечати.Представление = НСтр("ru = 'Согласие на обработку ПДн (табличный документ 1С:Предприятия)'");
	
	// Счет на оплату в формате Office Open XML (на основе СКД)
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.МенеджерПечати = "УправлениеПечатью";
	КомандаПечати.Идентификатор = "Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_DOC_СогласиеНаОбработкуПерсональныхДанных_ru";
	КомандаПечати.Представление = НСтр("ru = 'Согласие на обработку ПДн (документ Office Open XML)'");
	КомандаПечати.Картинка = БиблиотекаКартинок.ФорматWord;
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	
КонецПроцедуры

// См. УправлениеПечатьюПереопределяемый.ПриОпределенииИсточниковДанныхПечати
Процедура ПриОпределенииИсточниковДанныхПечати(Объект, ИсточникиДанныхПечати) Экспорт
	
	Если Объект = "Документ.СогласиеНаОбработкуПерсональныхДанных.ФИООтветственногоЗаОбработкуПДн" Тогда
		
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда
			МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов");
			МодульСклонениеПредставленийОбъектов.ПодключитьИсточникДанныхПечатиСклоненияСтрок(ИсточникиДанныхПечати);
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

// Формирует печатные формы.
//
// Параметры:
//  МассивОбъектов - см. УправлениеПечатьюПереопределяемый.ПриПечати.МассивОбъектов
//  ПараметрыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыПечати
//  КоллекцияПечатныхФорм - см. УправлениеПечатьюПереопределяемый.ПриПечати.КоллекцияПечатныхФорм
//  ОбъектыПечати - см. УправлениеПечатьюПереопределяемый.ПриПечати.ОбъектыПечати
//  ПараметрыВывода - см. УправлениеПечатьюПереопределяемый.ПриПечати.ПараметрыВывода
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	// Печать согласия
 	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СогласиеНаОбработкуПерсональныхДанных");
	Если ПечатнаяФорма <> Неопределено Тогда
		// имена файлов
		ИменаФайлов = Новый Соответствие;
		Шаблон = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Согласие на обработку ПДн [%1] - [%2] (№[%3] получено [%4])'"),
			"Субъект",
			"Организация",
			"Номер",
			"ДатаПолучения");
		ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Организация,Субъект,Номер,ДатаПолучения,Ссылка");
		Для Каждого Ссылка Из МассивОбъектов Цикл
			ЗначенияРеквизитовДокумента = ЗначенияРеквизитовДокументов[Ссылка];
			ЗначенияРеквизитовДокумента.ДатаПолучения = Формат(ЗначенияРеквизитовДокумента.ДатаПолучения, "ДЛФ=D");
			Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрефиксацияОбъектов") Тогда
				МодульПрефиксацияОбъектовКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПрефиксацияОбъектовКлиентСервер");
				ЗначенияРеквизитовДокумента.Номер = МодульПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ЗначенияРеквизитовДокумента.Номер);
			КонецЕсли;
			ИмяФайла = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]);
			ИменаФайлов.Вставить(Ссылка, ИмяФайла);
		КонецЦикла;
		
		// описание печатной формы
		ПечатнаяФорма.ТабличныйДокумент = ПечатьСогласияНаОбработкуПДн(МассивОбъектов, ОбъектыПечати);
		ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Согласие на обработку ПДн'");
		ПечатнаяФорма.ПолныйПутьКМакету = "Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_MXL_СогласиеНаОбработкуПерсональныхДанных";
		ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИменаФайлов;
	КонецЕсли;
			
КонецПроцедуры

// Конец СтандартныеПодсистемы.Печать

// СтандартныеПодсистемы.ПодключаемыеКоманды

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании
//  Параметры                  - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	Документы.ОтзывСогласияНаОбработкуПерсональныхДанных.ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании);
	
КонецПроцедуры

// Для использования в процедуре ДобавитьКомандыСозданияНаОсновании других модулей менеджеров объектов.
//  Добавляет в список команд создания на основании этот объект.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании
// 
// Возвращаемое значение:
//  СтрокаТаблицыЗначений, Неопределено - описание добавленной команды.
//
Функция ДобавитьКомандуСоздатьНаОсновании(КомандыСозданияНаОсновании) Экспорт
	
	Возврат СозданиеНаОсновании.ДобавитьКомандуСозданияНаОсновании(КомандыСозданияНаОсновании, Метаданные.Документы.СогласиеНаОбработкуПерсональныхДанных);
	
КонецФункции

// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Процедура печати согласия на обработку персональных данных.
//
Функция ПечатьСогласияНаОбработкуПДн(Согласия, ОбъектыПечати)
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.КлючПараметровПечати = "ПараметрыПечати_СогласиеНаОбработкуПерсональныхДанных";
	
	ОбластиМакета = Новый Структура;
	ОбластиМакета.Вставить("Заголовок");
	ОбластиМакета.Вставить("НомерДата");
	ОбластиМакета.Вставить("Преамбула");
	ОбластиМакета.Вставить("П1_ЦелиОбработкиПДн");
	ОбластиМакета.Вставить("П2_СоставПДн");
	ОбластиМакета.Вставить("П3_ДействияСПДн");
	ОбластиМакета.Вставить("П4_ПравоПолученияИнформации");
	ОбластиМакета.Вставить("П5_СрокДействия");
	ОбластиМакета.Вставить("П6_ПравоОтзыва");
	ОбластиМакета.Вставить("РеквизитыОператора");
	ОбластиМакета.Вставить("РеквизитыСубъекта");
	
	Макет = УправлениеПечатью.МакетПечатнойФормы("Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_MXL_СогласиеНаОбработкуПерсональныхДанных");
	
	ДанныеДляПечати = ДанныеДляПечатиСогласий(Согласия);
	
	// Вывод форм для субъектов.
	ПервыйДокумент = Истина;
	Для Каждого ОписаниеСогласия Из ДанныеДляПечати Цикл
		Если Не ПервыйДокумент Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();	
		КонецЕсли;
		ПервыйДокумент = Ложь;
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
		// Формируем печатную форму согласия.
		СогласиеФорма = Новый ТабличныйДокумент;
		Для Каждого КлючИЗначение Из ОбластиМакета Цикл
			ИмяОбласти = КлючИЗначение.Ключ;
			ОбластьМакета = Макет.ПолучитьОбласть(ИмяОбласти);
			ОбластьМакета.Параметры.Заполнить(ОписаниеСогласия);
			СогласиеФорма.Вывести(ОбластьМакета);
		КонецЦикла;
		ТабличныйДокумент.Вывести(СогласиеФорма);
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ОписаниеСогласия.ДокументОснование);
	КонецЦикла;
	
	Возврат ТабличныйДокумент;
	
КонецФункции

// Структура данных для подготовки печатных форм.
//
// Параметры:
//  Согласия - Массив из ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных.
//
// Возвращаемое значение:
//   Массив из см. Документ.СогласиеНаОбработкуПерсональныхДанных.ОписаниеСогласия
//
Функция ДанныеДляПечатиСогласий(Согласия)
	
	ДанныеДляПечати = Новый Массив;
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	Согласия.Ссылка КАК ДокументОснование,
		|	Согласия.Номер КАК Номер,
		|	Согласия.Организация КАК Организация,
		|	Согласия.НаименованиеОрганизации КАК НаименованиеОрганизации,
		|	Согласия.ЮридическийАдресОрганизации КАК АдресОрганизации,
		|	Согласия.ОтветственныйЗаОбработкуПерсональныхДанных КАК ОтветственныйЗаОбработкуПерсональныхДанных,
		|	Согласия.ФИООтветственногоЗаОбработкуПДн КАК ФИООтветственногоЗаОбработкуПДн,
		|	Согласия.Субъект КАК Субъект,
		|	Согласия.ФИОСубъекта КАК ФИО,
		|	Согласия.АдресСубъекта КАК Адрес,
		|	Согласия.ПаспортныеДанные КАК ПаспортныеДанные,
		|	Согласия.ДатаПолучения КАК ДатаСогласия,
		|	Согласия.СрокДействия КАК СрокДействия,
		|	Согласия.Ответственный КАК Ответственный,
		|	Согласия.Комментарий КАК Комментарий
		|ИЗ
		|	Документ.СогласиеНаОбработкуПерсональныхДанных КАК Согласия
		|ГДЕ
		|	Согласия.Ссылка В(&Согласия)");
		
	Запрос.УстановитьПараметр("Согласия", Согласия);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ПроверитьВозможностьОформленияСогласия(Выборка.Субъект);
		Описание = ОписаниеСогласия();
		ЗаполнитьЗначенияСвойств(Описание, Выборка);
		Если Не ПустаяСтрока(Выборка.НаименованиеОрганизации) Тогда
			Описание.Организация = Выборка.НаименованиеОрганизации;
		КонецЕсли;
		ЗаполнитьОрганизациюВДательномПадеже(Описание, Выборка.НаименованиеОрганизации);
		Если Не ПустаяСтрока(Выборка.ФИООтветственногоЗаОбработкуПДн) Тогда
			Описание.ОтветственныйЗаОбработкуПерсональныхДанных = Выборка.ФИООтветственногоЗаОбработкуПДн;
		КонецЕсли;
		ЗаполнитьОтветственногоВРодительномПадеже(Описание, Выборка.ФИООтветственногоЗаОбработкуПДн);
		Описание.ДатаСогласия = Формат(Выборка.ДатаСогласия, "ДЛФ=D");
		Если ЗначениеЗаполнено(Выборка.СрокДействия) Тогда
			Описание.ПериодДействия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'с %1 по %2.'"), Формат(Выборка.ДатаСогласия, "ДЛФ=D"), Формат(Выборка.СрокДействия, "ДЛФ=D"));
		Иначе
			Описание.ПериодДействия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'с %1 бессрочно.'"), Формат(Выборка.ДатаСогласия, "ДЛФ=D"));
		КонецЕсли;
		ДанныеДляПечати.Добавить(Описание);
	КонецЦикла;
	
	Возврат ДанныеДляПечати;
	
КонецФункции

// Возвращаемое значение:
//   Структура:
//     * ДатаСогласия                  - Строка
//     * ДокументОснование             - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных
//     * Организация                   - Строка
//     * ОрганизацияВДательномПадеже   - Строка
//     * АдресОрганизации              - Строка
//     * ОтветственныйЗаОбработкуПерсональныхДанных                   - Строка
//     * ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже - Строка
//     * ПериодДействия                - Строка
//     * ФИО                           - Строка
//     * Адрес                         - Строка
//     * ПаспортныеДанные              - Строка
//
Функция ОписаниеСогласия()
	
	ОписаниеСогласия = Новый Структура(
		"ДатаСогласия,
		|ДокументОснование, 
		|Организация, 
		|ОрганизацияВДательномПадеже, 
		|АдресОрганизации, 
		|ОтветственныйЗаОбработкуПерсональныхДанных, 
		|ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже, 
		|ПериодДействия, 
		|ФИО, 
		|Адрес, 
		|ПаспортныеДанные");
		
	ОписаниеСогласия.ДатаСогласия = НСтр("ru = '«____»_______________20___г.'");
	ОписаниеСогласия.Организация = НСтр("ru = '<Организация>'");
	ОписаниеСогласия.ОрганизацияВДательномПадеже = ОписаниеСогласия.Организация;
	ОписаниеСогласия.АдресОрганизации = НСтр("ru = '<Адрес организации>'");
	ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанных = НСтр("ru = '<ФИО ответственного лица>'");
	ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже = ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанных;

	Возврат ОписаниеСогласия;
	
КонецФункции

Процедура ЗаполнитьОрганизациюВДательномПадеже(ОписаниеСогласия, НаименованиеОрганизации)
	
	Если ПустаяСтрока(НаименованиеОрганизации) Тогда
		ОписаниеСогласия.ОрганизацияВДательномПадеже = ОписаниеСогласия.Организация;
		Возврат;
	КонецЕсли;
	
	ОписаниеСогласия.ОрганизацияВДательномПадеже = НаименованиеОрганизации;
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда
		МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов");
		ОписаниеСогласия.ОрганизацияВДательномПадеже = МодульСклонениеПредставленийОбъектов.ПросклонятьПредставление(НаименованиеОрганизации, 3);
	КонецЕсли;
	
КонецПроцедуры

Процедура ЗаполнитьОтветственногоВРодительномПадеже(ОписаниеСогласия, ФИООтветственного)
	
	Если ПустаяСтрока(ФИООтветственного) Тогда
		ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже = ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанных;
		Возврат;
	КонецЕсли;
	
	ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже = ФИООтветственного;
	
	СклонениеФИО = "";
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СклонениеПредставленийОбъектов") Тогда
		МодульСклонениеПредставленийОбъектов = ОбщегоНазначения.ОбщийМодуль("СклонениеПредставленийОбъектов");
		СклонениеФИО = МодульСклонениеПредставленийОбъектов.ПросклонятьФИО(ФИООтветственного, 2);
	КонецЕсли;
	
	Если Не ПустаяСтрока(СклонениеФИО) Тогда
		ОписаниеСогласия.ОтветственныйЗаОбработкуПерсональныхДанныхВРодительномПадеже = СклонениеФИО;
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Работа с макетами офисных документов.

Процедура ПроверитьВозможностьОформленияСогласия(СубъектПДн) Экспорт
	
	Если ЗащитаПерсональныхДанных.ЭтоОбъектСУничтоженнымиПерсональнымиДанными(СубъектПДн) Тогда
		ВызватьИсключение НСтр("ru = 'Оформление согласия невозможно. Персональные данные субъекта уничтожены.'");
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#КонецЕсли